void main() {
  //大致同java的泛型一样用法
  //1、使用泛型有以下优点
  //  1:类型安全
  var ints1 = List<int>();
  ints1.add(1);
//  ints.add('jack'); // Error
  //  2:减少代码重复，如List<T>
  //2、泛型的使用
  //  1:List和Map等
  var ints2 = List<int>();
  var maps = Map<String, String>();
  //  2:泛型类或接口,如BeanHolder
  PersonHolder personHolder = PersonHolder();
  personHolder.setBean(Person('jack',1));
  print(personHolder.getBean().name);
  //  3:泛型方法(参数、返回值、局部变量)
  T getData<T>(T value) {
    T localValue = value;
    return value;
  }
  print(getData(1));
  //  4:构造函数，如Person
  Person person1 = Person('lily', 12);
  person1.printElementType();
  Person person2 = Person('lily', 12.0);
  person2.printElementType();
  //3、泛型限定，可以使用extends限定上边界
  //4、Java中，运行时泛型是擦除的，但dart中可以知道
  var ints3 = List<int>();
  print(ints3 is List<String>); // false
  print(ints3 is List<int>); // true
}

abstract class BeanHolder<T> {
  T bean;

  setBean(T bean) {
    this.bean = bean;
  }

  T getBean() => bean;
}

class Person<E extends num> {
  String name;
  E age;

  Person(this.name,this.age);
  printElementType(){
    print(age.runtimeType);
  }
}

class PersonHolder extends BeanHolder<Person> {}

